#ifndef XENCODE_H
#define XENCODE_H
#include <mutex>
#include <vector>
struct AVCodecContext;
struct AVFrame;
struct AVPacket;
class XEncode {
public:
  XEncode();
  /// @brief 创建编码器上下文，非线程安全
  /// @param codec_id 编码器id
  /// @return 编码器上下文，失败放回nullptr
  static AVCodecContext *Create(int codec_id);
  /// @brief 创建编码器上下文，非线程安全
  /// @param name 编码器名称
  /// @return 编码器上下文，失败放回nullptr
  static AVCodecContext *Create(const char *name);
  /// @brief 设置编码器上下文(也可以用来清理上下文，只需要设置nullptr)，
  /// 线程安全
  /// @param c 编码器上下文
  void set_c(AVCodecContext *c);
  /// 设置编码参数 线程安全
  bool SepOpt(const char *key, const char *val);
  bool SepOpt(const char *key, int val);
  /// 打开编码器 线程安全
  bool Open();
  /// 编码数据 线程安全 每次会新创建AVPacket
  /// @param 编码视屏数据 线程安全
  /// @return 失败放回nullptr，需要用户管理内存
  AVPacket *Encode(const AVFrame *frame, int *errNo = nullptr);
  /// 根据AVCodecContext创建一个AVFrame，需要用户管理内存
  AVFrame *CreateFrame();
  std::vector<AVPacket *> End();

private:
  AVCodecContext *c_ = nullptr;
  // 编码器上下文的锁
  std::mutex mux_;
};

#endif // XENCODE_H
